package com.color.admin.system.entity;


import com.color.admin.common.core.constant.Constant;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

/**
 * @author HaiQiu
 * @date 2022/1/18
 * 基于代码复用和模型分离的思想，在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。
 * 例如，数据库表中都需要id来表示编号，
 * id是这些映射实体类的通用的属性，交给jpa统一生成主键id编号，那么使用一个父类来封装这些通用属性，并用@MappedSuperclas标识。
 * 注意:
 * 1.标注为@MappedSuperclass的类将不是一个完整的实体类，他将不会映射到数据库表，但是他的属性都将映射到其子类的数据库字段中。
 * 2.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解，也无需实现序列化接口。
 *
 * @EntityListeners(AuditingEntityListener.class)
 * 对实体属性变化的跟踪，它提供了保存前，保存后，更新前，更新后，删除前，删除后等状态，就像是拦截器一样，你可以在拦截方法里重写你的个性化逻辑。
 */
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity implements Serializable {

    @CreatedBy
    @Column(name = "create_by", updatable = false)
    @Schema(description = "创建人", hidden = true)
    private String createBy;

    @LastModifiedBy
    @Column(name = "update_by")
    @Schema(description = "更新人", hidden = true)
    private String updateBy;

    @NotNull(message = "激活状态"+ Constant.NOT_EMPTY)
    @Schema(example = "true", type = "boolean",description = "激活：true激活，false禁用")
    @Column(name = "active")
    private Boolean active;

    @Max(value = 5000,message = "排序长度只能在0-5000个数字之间")
    @Min(value = 0,message = "排序长度只能在0-5000个数字之间")
    @Schema(example = "0", type = "integer",description = "排序")
    @Column(name = "sort",length = 5000)
    private Integer sort;

    @Schema(description = "创建时间",hidden = true)
    @Column(name = "create_time")
    private Date createTime;

    @Schema(description = "修改时间",hidden = true)
    @Column(name = "update_time")
    private Date updateTime;

    /**
     * 分组校验注解：新增
     */
    public @interface add{}

    /**
     * 分组校验注解：修改
     */
    public @interface update{}


    public String getCreateBy() {
        return createBy;
    }

    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }

    public String getUpdateBy() {
        return updateBy;
    }

    public void setUpdateBy(String updateBy) {
        this.updateBy = updateBy;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public Integer getSort() {
        return sort;
    }

    public void setSort(Integer sort) {
        this.sort = sort;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}
